﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Servico.Bovespa.Titulo;

namespace Sinacor.Servico.Bovespa.Titulo.BusinessLogic
{
    public class Titulo: BaseBusinessLogic
    {
      
        #region Construtor
        public Titulo() : base()
        {  }
        #endregion

        #region Constantes de Erro
        private const int ERRO_QUANTIDADEMINIMALOTENAOENCONTRADA = 100000;
        private const int ERRO_MERCADO_DEVESERINFROMADO = 100001;
        //private const int ERRO_UMDOSPARAMETROSDEVESERINFORMADO = 100002; //excluido - eduardo - 20080207
        private const int ERRO_TITULO_NOMESAOUISINOUTITULODEVESERINFORMADO = 100002; //incluido - eduardo - 20080207
        private const int ERRO_TITULONAOEXISTENTE = 100003;
        private const int ERRO_TITULO_PESQUISA_SEM_RESULTADO = 100004;
        private const int ERRO_TITULO_TITULODEVESERINFORMADO = 100005; //incluido - eduardo - 20080206
        private const int ERRO_TITULO_DATAORDEMDEVESERINFORMADO = 100006; //incluido - eduardo - 20080206
        private const int ERRO_TITULO_DATAPREGAODEVESERINFROMADO = 100007; //incluido - eduardo - 20080207
        #endregion

        /// <summary>
        /// Data : 07/02/2008
        /// Autor: Eduardo Sertorio
        /// Obs. : Ajustado tratamento ValidationException para listar mais de um erro.
        /// Obs. : Alterado nome da constante de erro para especificar os parametros obrigatorios.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public List<BusinessEntity.Titulo> ConsultarTitulo(BusinessEntity.Titulo request)
        {
            
            ResourceAccess.Titulo raTitulo = new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo();
            List<BusinessEntity.Titulo> beTituloColletion = null;
            ValidationException ex = new ValidationException(); //incluido - eduardo - 20080207

            //alterado - eduardo - 20080207
            if ((String.IsNullOrEmpty(request.NomeSA)) 
                && (String.IsNullOrEmpty(request.CodigoISIN)) 
                && (String.IsNullOrEmpty(request.Codigo)))
            {
                //throw new BusinessException(ERRO_UMDOSPARAMETROSDEVESERINFORMADO); //excluido - eduardo - 20080207
                ex.AddError(ERRO_TITULO_NOMESAOUISINOUTITULODEVESERINFORMADO); //incluido - eduardo - 20080207
            }
            //Ptruiz.gp - 2008.12.09 - alteração conforme solicitação do Gerente de Produto
            //if (request.TipoMercado == null)
            //{
            //    ex.AddError(ERRO_MERCADO_DEVESERINFROMADO);
            //    //throw ex; //excluido - eduardo - 20080207
            //}

            if (ex.ValidationErrors != null && ex.ValidationErrors.Count > 0) //incluido - eduardo - 20080207
                throw ex; //incluido - eduardo - 20080207

            beTituloColletion = raTitulo.ConsultarTitulo(request);

            return beTituloColletion;

        }

        /// <summary>
        /// Metodo responsavel por recuperar a quantidade minima do lote de negociacao
        /// Historio:
        /// Data: 23/11/2007
        /// Autor: Diogo Milanez
        /// Observacoes: Criacao do Metodo
        /// </summary>
        /// <param name="negocio"></param>
        /// <returns></returns>
        public int? ConsultarQuantidadeMinimaLoteNegociacao(BusinessEntity.Titulo titulo)
        {
            int? retorno;
           
            ResourceAccess.Titulo tituloRA = new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo();
            retorno = tituloRA.ConsultarQuantidadeMinimaLoteNegociacao(titulo);

            //20080403 18:43 - Conforme conversado com Nemir, quando não tiver qtde minima de negociacao, 
            //assume 1 como valor padrão
            if (retorno == null || retorno == 0) //20080424 11:21 - Alterado segundo orientacao do analista sinacor - DMilanez.7Comm
                retorno = 1;
            

            return retorno;
        }

        /// <summary>
        /// Historico:
        /// Data : 27/12/2007
        /// Autor: Ludmilla Modesto 
        /// Obs.: Implementado. Metodo que retorna titulos.
        /// 
        /// Data:28/01/2008 16:40
        /// Autor:Dmilanez.7comm
        /// Obs: 
        /// Disparar excecao no caso de nao retornar nada na consulta
        /// 
        /// Data : 07/02/2008
        /// Autor: Eduardo Sertorio
        /// Obs. : Incluido tratamento para campo obrigatorio DataPregao
        /// Obs. : Ajustado tratamento ValidationException para listar mais de um erro.
        /// Obs. : Alterado nome da constante de erro para especificar os parametros obrigatorios.
        /// </summary>
        /// <returns></returns>
        public List<BusinessEntity.Titulo> ConsultarTitulos(BusinessEntity.Titulo request)
        {
           
            ResourceAccess.Titulo raTitulo = new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo(); 
            List<BusinessEntity.Titulo> beTituloColletion = null;
            ValidationException ex = new ValidationException(); //incluido - eduardo - 20080207

            //alterado - eduardo - 20080207
            if ((String.IsNullOrEmpty(request.NomeSA))
                && (String.IsNullOrEmpty(request.CodigoISIN)) 
                && (String.IsNullOrEmpty(request.Codigo)))
            {
                //throw new BusinessException(ERRO_UMDOSPARAMETROSDEVESERINFORMADO); //excluido - eduardo - 20080207
                ex.AddError(ERRO_TITULO_NOMESAOUISINOUTITULODEVESERINFORMADO); //incluido - eduardo - 20080207
            }
            //Ptruiz.gp - 2008.12.09 - alteração conforme solicitação do Gerente de Produto
            //if (!request.TipoMercado.HasValue)
            //{
            //    //ValidationException ex = new ValidationException(); //excluido - eduardo - 20080207
            //    ex.AddError(ERRO_MERCADO_DEVESERINFROMADO);
            //    //throw ex; //excluido - eduardo - 20080207
            //}

            if (!request.DataPregao.HasValue) //incluido - eduardo - 20080207
            {
                //ValidationException ex = new ValidationException(); //excluido - eduardo - 20080207
                ex.AddError(ERRO_TITULO_DATAPREGAODEVESERINFROMADO); //incluido - eduardo - 20080207
                //throw ex; //excluido - eduardo - 20080207
            }

            if (ex.ValidationErrors != null && ex.ValidationErrors.Count > 0) //incluido - eduardo - 20080207
                throw ex; //incluido - eduardo - 20080207

            /// Data: 17/01/2008
            /// Autor: Diogo Milanez
            /// Obs: Data do pregao passou a ser parametro de entrada do servico
            ///DateTime dataPregao = Calendario.ResourceAccess.DataMovimento.RecuperarDataMovimento();

            beTituloColletion = raTitulo.ConsultarTitulos(request);

            /// Data:15/02/2008 11:20
            /// Autor:DMilanez.7Comm
            /// Obs:
            /// Alterado de forma a nao disparar mais uma excecao caso nao haja retorno de dados da base
            if (beTituloColletion == null)
                beTituloColletion = new List<Sinacor.Servico.Bovespa.Titulo.BusinessEntity.Titulo>();

            return beTituloColletion;

        }

        public void ValidarTitulo(BusinessEntity.Titulo titulo)
        {
            List<BusinessEntity.Titulo> titulol = ConsultarTitulo(titulo);
            if (titulol.Count == 0)
            {
                
                if ((new ResourceAccess.Titulo().ConsultarTituloVista(titulo).Count == 0))
                        throw new BusinessException(ERRO_TITULONAOEXISTENTE);
            }
        }

        /// <summary>
        /// Consultar Titulo por Codigo de Negociacao e Data da Ordem
        /// Autor: Eduardo Sertorio
        /// Data: 10/01/2008
        /// 
        /// Autor: Eduardo Sertorio
        /// Data : 06/02/2008
        /// Obs. : Inclusao da validacao dos campos obrigatorios para consulta
        /// </summary>
        /// <param name="request">BusinessEntities.Titulo</param>
        /// <returns>BusinessEntities.Titulo</returns>        
        public BusinessEntity.Titulo ConsultarTituloCodigo(BusinessEntity.Titulo request)
        {
            ValidationException validationException = new ValidationException(); //incluido - eduardo - 20080206

            if (String.IsNullOrEmpty(request.Codigo)) //incluido - eduardo - 20080206
            {
                validationException.AddError(ERRO_TITULO_TITULODEVESERINFORMADO);
            }

            if (!request.DataOrdem.HasValue)
            {
                validationException.AddError(ERRO_TITULO_DATAORDEMDEVESERINFORMADO);
            }

            if (validationException.ValidationErrors != null && validationException.ValidationErrors.Count > 0) //incluido - eduardo - 20080206
            {
                throw validationException;
            }

            BusinessEntity.Titulo response = (new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo()).ConsultarTituloCodigo(request); //alterado - eduardo - 20080206

            //20080413 10:56 - Alterado - DMilanez.7Comm
            //if (response == null) //incluido - eduardo - 20080206
            //{
            //    throw new BusinessException(ERRO_TITULO_PESQUISA_SEM_RESULTADO); //incluido - eduardo - 20080206
            //}

            return response; //incluido - eduardo - 20080206
        }


        /// <summary>
        /// Método Consultar Lote Minimo Negociacao
        /// Data: 17/09/2008
        /// Author: APSilva
        /// </summary>
        public System.Int32 ConsultarLoteMinimoNegociacao(BusinessEntity.Parameter.ConsultarLoteMinimoNegociacao pConsultarLoteMinimoNegociacao)
        {

            ResourceAccess.Titulo consultar = new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo();
            return consultar.ConsultarLoteMinimoNegociacao(pConsultarLoteMinimoNegociacao);
        }

        /// <summary>
        /// Obtém títulos de Ativo
        /// </summary>
        /// <param name="request">BusinessEntity.Titulo</param>
        /// <returns>BusinessEntity.Titulo</returns>
        public BusinessEntity.Titulo ObterTitulo(BusinessEntity.Titulo request)
        {
            if (request == null)
                throw new BusinessException(109037);
            else if(String.IsNullOrEmpty(request.Codigo))
                throw new BusinessException(100005);
            else if(!request.DataOrdem.HasValue)
                throw new BusinessException(100006);

            return (new ResourceAccess.Titulo()).ObterTitulo(request);
        }


        public BusinessEntity.TituloPeriodo ConsultarTituloPeriodo(BusinessEntity.Parameter.FiltroNomeTitulo request)
        {
            ResourceAccess.Titulo raTitulo = new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo();
            return raTitulo.ConsultarTituloPeriodo(request);
        }

        public BusinessEntity.ExistenciaNomeTitulo ValidarExistenciaNomeTitulo(BusinessEntity.Parameter.FiltroNomeTitulo parameter)
        {
            BusinessEntity.ExistenciaNomeTitulo retorno = new Sinacor.Servico.Bovespa.Titulo.BusinessEntity.ExistenciaNomeTitulo();

            retorno.ExisteNomeTitulo = (ConsultarTituloPeriodo(parameter) != null) ? true : false;

            return retorno;

        }

        /// <summary>
        /// Consulta os titulos sem nenhum filtro obrigatorio
        /// </summary>
        /// <param name="request"></param>
        public List<BusinessEntity.Titulo> ConsultarTodosTitulos(BusinessEntity.Titulo request)
        {

            //Ver diagrama de sequencia
            //
            //Obs: apenas irá chamar o método
            //ResourceAccess.ConsultarTitulos já
            //existente. Não validar o preenchimento
            //de nenhum filtro.

            ResourceAccess.Titulo ra = new Sinacor.Servico.Bovespa.Titulo.ResourceAccess.Titulo();
            return ra.ConsultarTitulo(request);
            //throw new InvalidOperationException("The method wasn't implemented");
        }
    }

}
